//package com.xinggq.gateway.service.impl;
//
//import com.xinggq.auth.api.dto.login.AuthSafeUserInfoDTO;
//import com.xinggq.common.CommonResult;
//import com.xinggq.gateway.feign.TokenManagerClient;
//import com.xinggq.gateway.service.TokenService;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//import reactor.core.publisher.Mono;
//import reactor.core.scheduler.Schedulers;
//
///**
// * 令牌服务实现类
// *
// * @author xinggq
// * @since 2023-10-20
// */
//@Slf4j
//@Service
//@RequiredArgsConstructor
//public class TokenServiceImpl implements TokenService {
//
//  private final TokenManagerClient tokenManagerClient;
//
//
//  /**
//   * 验证访问令牌并返回安全用户信息（响应式）
//   * - 使用 `Mono` 表示最多一个异步结果，保持网关链路非阻塞
//   * - 使用 `boundedElastic` 将阻塞的 Feign 调用切换到弹性线程池
//   * - 仅当认证中心返回 `SUCCESS(1000)` 时返回用户信息，否则返回 null
//   */
//  @Override
//  public Mono<AuthSafeUserInfoDTO> validateToken(String token) {
//    return Mono.fromCallable(() -> {
//          // 调用认证中心验证令牌（阻塞调用，下面通过调度器切换线程池）
//          CommonResult<AuthSafeUserInfoDTO> commonResult = tokenManagerClient.validateTokenAndGetUserInfo(
//              token);
//          // 判空保护：认证中心异常或网络问题时可能返回 null
//          if (commonResult == null) {
//            log.warn("令牌验证失败，认证中心返回空");
//            return null;
//          }
//          if (!commonResult.isSuccess()) {
//            log.warn("令牌验证失败，code={}, msg={}", commonResult.getCode(), commonResult.getMsg());
//            return null;
//          }
//          // 成功返回用户信息，供后续过滤器写入下游请求头
//          return commonResult.getData();
//        })
//        // 将阻塞操作放到弹性线程池，避免阻塞事件循环线程
//        .subscribeOn(Schedulers.boundedElastic())
//        // 记录异常日志；错误会通过 Reactor 信号传播到调用方的 onErrorResume
//        .doOnError(e -> log.error("令牌验证异常", e));
//  }
//}